package org.lgq.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * es-job的配置注解
 *
 * @author DevLGQ
 * @version 1.0
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ElasticJobConfig {

    /**
     * 作业类型
     *
     * @return
     */
    String jobType();

    /**
     * 作业名称
     *
     * @return
     */
    String jobName();

    /**
     * cron表达式，用于控制作业触发时间
     *
     * @return
     */
    String cron() default "";

    /**
     * 作业分片总数
     *
     * @return
     */
    int shardingTotalCount() default 1;

    /**
     * 分片序列号和参数用等号分隔，多个键值对用逗号分隔
     * 分片序列号从0开始，不可大于或等于作业分片总数
     *
     * @return
     */
    String shardingItemParameters() default "";

    /**
     * 是否开启任务执行失效转移，开启表示如果作业在一次任务执行中途宕机，允许将该次未完成的任务在另一作业节点上补偿执行
     *
     * @return
     */
    boolean failover() default false;

    /**
     * 是否开启错过任务重新执行
     *
     * @return
     */
    boolean misfire() default true;

    /**
     * 作业描述信息
     *
     * @return
     */
    String description() default "";

    /**
     * 本地配置是否可覆盖注册中心配置
     * 如果可覆盖，每次启动作业都以本地配置为准
     *
     * @return
     */
    boolean overwrite() default false;

    /**
     * 是否流式处理数据
     * 如果流式处理数据, 则fetchData不返回空结果将持续执行作业
     * 如果非流式处理数据, 则处理数据完成后作业结束
     *
     * @return
     */
    boolean streamingProcess() default false;

    /**
     * 脚本型作业执行命令行
     *
     * @return
     */
    String scriptCommandLine() default "";

    /**
     * <p>监控作业运行时状态</p>
     * <p>每次作业执行时间和间隔时间均非常短的情况，建议不监控作业运行时状态以提升效率。因为是瞬时状态，所以无必要监控。</p>
     * <p>请用户自行增加数据堆积监控。并且不能保证数据重复选取，应在作业中实现幂等性。</p>
     * <p>每次作业执行时间和间隔时间均较长的情况，建议监控作业运行时状态，可保证数据不会重复选取。</p>
     *
     * @return
     */
    boolean monitorExecution() default true;


    /**
     * 最大允许的本机与注册中心的时间误差秒数
     * 如果时间误差超过配置秒数则作业启动时将抛异常
     * 配置为-1表示不校验时间误差
     *
     * @return
     */
    int maxTimeDiffSeconds() default -1;

    /**
     * 作业自定义参数
     */
    String jobParameter() default "";

    /**
     * 作业分片策略类型
     *
     * @return
     */
    String jobShardingStrategyType() default "AVG_ALLOCATION";

    /**
     * 修复作业服务器不一致状态服务调度间隔时间，配置为小于1的任意值表示不执行修复
     *
     * @return
     */
    int reconcileIntervalMinutes() default 10;

    /**
     * 作业是否禁止启动
     *
     * @return
     */
    boolean disabled() default false;

    /**
     * 最后一个作业执行前的执行方法的超时时间
     *
     * @return
     */
    long startedTimeoutMilliseconds() default Long.MAX_VALUE;

    /**
     * 最后一个作业执行后的执行方法的超时时间
     *
     * @return
     */
    long completedTimeoutMilliseconds() default Long.MAX_VALUE;

    /**
     * 作业线程池处理策略
     *
     * @return
     */
    String jobExecutorServiceHandlerType() default "CPU";

    /**
     * 作业错误处理策略
     *
     * @return
     */
    String jobErrorHandlerType() default "";

    /**
     * http请求url
     *
     * @return
     */
    String httpUrl() default "";

    /**
     * http请求方法
     *
     * @return
     */
    String httpMethod() default "";

    /**
     * http请求数据
     *
     * @return
     */
    String httpData() default "";

    /**
     * http连接超时
     *
     * @return
     */
    String httpConnectTimeoutMilliseconds() default "3000";

    /**
     * http读超时
     *
     * @return
     */
    String httpReadTimeoutMilliseconds() default "5000";

    /**
     * http请求ContentType.
     *
     * @return
     */
    String httpContentType() default "";

}
